import axios from 'axios'
import { ElMessage, ElMessageBox } from 'element-plus'
import { loading } from './loading'
import config from '@/config'

// 创建axios实例
const request = axios.create({
    baseURL: config.baseURL,
    timeout: config.timeout,
    headers: {
        'Content-Type': 'application/json'
    }
})

// 请求拦截器
request.interceptors.request.use(
    config => {
        // 可以在这里添加token等认证信息
        const token = localStorage.getItem('token')
        if (token) {
            config.headers.Authorization = `Bearer ${token}`
        }

        // 显示loading
        if (config.showLoading !== false) {
            loading.show()
        }

        return config
    },
    error => {
        console.error('Request error:', error)
        return Promise.reject(error)
    }
)

// 响应拦截器
request.interceptors.response.use(
    response => {
        const { data, config } = response

        // 隐藏loading
        if (config.showLoading !== false) {
            loading.hide()
        }

        // 统一处理响应数据
        if (data.code === 200) {
            return data
        } else {
            // 业务错误处理
            ElMessage.error(data.message || '请求失败')
            return Promise.reject(new Error(data.message || '请求失败'))
        }
    },
    error => {
        console.error('Response error:', error)

        // 隐藏loading
        if (error.config && error.config.showLoading !== false) {
            loading.hide()
        }

        // 统一错误处理
        let message = '网络错误'

        if (error.response) {
            const { status, data } = error.response

            switch (status) {
                case 400:
                    message = data.message || '请求参数错误'
                    break
                case 401:
                    message = '未授权，请重新登录'
                    // 可以在这里处理登录过期
                    localStorage.removeItem('token')
                    // 跳转到登录页
                    break
                case 403:
                    message = '拒绝访问'
                    break
                case 404:
                    message = '请求地址不存在'
                    break
                case 406:
                    message = '请求格式不正确'
                    break
                case 500:
                    message = data.message || '服务器内部错误'
                    break
                default:
                    message = data.message || `请求失败 (${status})`
            }
        } else if (error.request) {
            message = '网络连接失败，请检查网络'
        } else {
            message = error.message || '请求配置错误'
        }

        ElMessage.error(message)
        return Promise.reject(error)
    }
)

// 封装请求方法
export const http = {
    get(url, params, config = {}) {
        return request.get(url, { params, ...config })
    },

    post(url, data, config = {}) {
        return request.post(url, data, config)
    },

    put(url, data, config = {}) {
        return request.put(url, data, config)
    },

    delete(url, config = {}) {
        return request.delete(url, config)
    },

    patch(url, data, config = {}) {
        return request.patch(url, data, config)
    }
}

export default request 